
package com.ruoyi.wms.util;

import com.ruoyi.common.core.exception.ServiceException;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.List;

/**
 * 时间范围工具类，用于根据不同粒度获取统计时间范围
 */
public class TimeRangeUtils {

    /** 按天统计（实际为按月统计） */
    public static final int GRANULARITY_DAY = 0;
    /** 按月统计（实际为按年统计） */
    public static final int GRANULARITY_MONTH = 1;
    /** 按年统计 */
    public static final int GRANULARITY_YEAR = 2;
    /** 统计最近7天（含今天，左闭右开） */
    public static final int GRANULARITY_LAST_7_DAYS = 3;

    /**
     * 根据时间粒度获取统计时间范围
     * @param date 基准日期
     * @param granularity 统计粒度（0-按天，1-按月，2-按年，3-最近7天）
     * @return 时间范围列表 [开始时间, 结束时间]
     */
    public static List<LocalDateTime> getStatisticTimeRange(LocalDateTime date, int granularity) {
        LocalDateTime beginTime;
        LocalDateTime endTime;
        LocalDateTime currentTime = LocalDateTime.now();

        switch (granularity) {
            case GRANULARITY_DAY -> {
                // 按天统计（实际是按当月统计）
                beginTime = date.with(TemporalAdjusters.firstDayOfMonth())
                    .withHour(0).withMinute(0).withSecond(0).withNano(0);
                if (isSameMonth(date, currentTime)) {
                    endTime = currentTime;
                } else {
                    // 结束时间设为下月第一天0点，便于查询时使用小于操作
                    endTime = date.with(TemporalAdjusters.firstDayOfNextMonth())
                        .withHour(0).withMinute(0).withSecond(0).withNano(0);
                }
            }
            case GRANULARITY_MONTH -> {
                // 按月统计（实际是按当年统计）
                beginTime = date.with(TemporalAdjusters.firstDayOfYear())
                    .withHour(0).withMinute(0).withSecond(0).withNano(0);
                if (date.getYear() == currentTime.getYear()) {
                    endTime = currentTime;
                } else {
                    // 结束时间设为下年第一天0点
                    endTime = date.plusYears(1).with(TemporalAdjusters.firstDayOfYear())
                        .withHour(0).withMinute(0).withSecond(0).withNano(0);
                }
            }
            case GRANULARITY_YEAR -> {
                // 按年统计（单独分离出来）
                beginTime = LocalDateTime.of(2010, 1, 1, 0, 0, 0, 0);
                if (date.getYear() == currentTime.getYear()) {
                    endTime = currentTime;
                } else {
                    // 结束时间设为下年第一天0点
                    endTime = date.plusYears(1).with(TemporalAdjusters.firstDayOfYear())
                        .withHour(0).withMinute(0).withSecond(0).withNano(0);
                }
            }
            case GRANULARITY_LAST_7_DAYS -> {
                // 统计最近7天（含今天，左闭右开）
                // 结束时间为明天的0点（不包含明天的数据）
                endTime = LocalDateTime.now();
                // 开始时间为7天前的0点（包含7天前的数据）
                beginTime = date.minusDays(6).withHour(0).withMinute(0).withSecond(0).withNano(0);
            }
            default -> throw new ServiceException("无效的时间统计粒度: " + granularity);
        }

        return List.of(beginTime, endTime);
    }

    /**
     * 判断两个日期是否在同一个月
     */
    private static boolean isSameMonth(LocalDateTime date1, LocalDateTime date2) {
        return date1.getYear() == date2.getYear() &&
            date1.getMonth() == date2.getMonth();
    }
}
